const fs = require("fs")
const babelParser = require("@babel/Parser")
const traverse = require('@babel/traverse').default
const path = require("path")
const {transformFromAst} = require('@babel/core')

function mywebpack(config){
  return new Compiler(config)
}

class Compiler {
  constructor(options={}){
    this.options = options
  }

  // 启动webpack
  run(){
    // 1,读取入口文件内容
    const filepath = this.options.entry    // 入口文件路径
    const file =  fs.readFileSync(filepath, 'utf-8')  // utf-8 是为了转换成文本文件.使其能够转换成 AST
    // 2,将其解析成ast 抽象语法树
    // 借助babel 工具   @babel/parser    Babel.Parser.parse(code,[options])
    const ast =  babelParser.parse(file,{
      sourceType: 'module' // 解析成 ES module
    })
    // debugger;
    // console.log(ast);

    //  获取文件夹路径
    const dirname = path.dirname(filepath)
    // 定义存储依赖的容器
    const deps = {}

    // 收集依赖
    traverse(ast, {
      // 内部会遍历ast中的 program.body, 判断里面语句类型
      // 如果 type 是ImportDeclaration  就会触发当前函数
      ImportDeclaration ({node}){
        // 文件相对路径  './add.js'
        const relativepath = node.source.value
        // 生成基于入口文件的绝对路径
        const absolutepath = path.resolve(dirname, relativepath)
        // 添加依赖
        deps[relativepath] = absolutepath
      }
    })

    console.log(deps);

    // 解析编译代码,讲代码中浏览器不能识别的语法进行编译
      const {code} =  transformFromAst(ast,null,{
      presets: ['@babel/preset-env']
    })

    console.log(code);
  }
}

module.exports = mywebpack